﻿using System;
using System.Windows.Forms;

namespace Kyoh.Lib.WinForms
{
    /// <summary>DataGridView に ProgressBar を表示する列。</summary>
    public class DataGridViewProgressBarColumn : DataGridViewTextBoxColumn
    {
        /// <summary><see cref="DataGridViewProgressBarColumn"/> クラスの新しいインスタンスを初期化します。</summary>
        public DataGridViewProgressBarColumn()
        {
            this.CellTemplate = new DataGridViewProgressBarCell();
        }

        /// <summary>この列に追加するセルのテンプレートを取得・設定します。</summary>
        public override DataGridViewCell CellTemplate
        {
            get { return base.CellTemplate; }
            set
            {
                //DataGridViewProgressBarCell以外はホストしない
                if (!(value is DataGridViewProgressBarCell))
                    throw new InvalidCastException(Properties.Resources.DataGridViewProgressBarColumnInvalidCellTemplate);
                base.CellTemplate = value;
            }
        }

        /// <summary>ProgressBarの最大値を取得・設定します。</summary>
        public int Maximum
        {
            get { return ((DataGridViewProgressBarCell)this.CellTemplate).Maximum; }
            set
            {
                if (this.Maximum == value)
                    return;
                //セルテンプレートの値を変更する
                ((DataGridViewProgressBarCell)this.CellTemplate).Maximum =
                    value;
                //DataGridViewにすでに追加されているセルの値を変更する
                if (this.DataGridView == null)
                    return;
                int rowCount = this.DataGridView.RowCount;
                for (int i = 0; i < rowCount; i++)
                {
                    DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
                    ((DataGridViewProgressBarCell)r.Cells[this.Index]).Maximum =
                        value;
                }
            }
        }

        /// <summary>ProgressBarの最小値を取得・設定します。</summary>
        public int Minimum
        {
            get { return ((DataGridViewProgressBarCell)this.CellTemplate).Minimum; }
            set
            {
                if (this.Minimum == value)
                    return;
                //セルテンプレートの値を変更する
                ((DataGridViewProgressBarCell)this.CellTemplate).Minimum =
                    value;
                //DataGridViewにすでに追加されているセルの値を変更する
                if (this.DataGridView == null)
                    return;
                int rowCount = this.DataGridView.RowCount;
                for (int i = 0; i < rowCount; i++)
                {
                    DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
                    ((DataGridViewProgressBarCell)r.Cells[this.Index]).Minimum =
                        value;
                }
            }
        }

        /// <summary>ProgressBarの最小値を取得・設定します。</summary>
        public bool DisplayText
        {
            get { return ((DataGridViewProgressBarCell)this.CellTemplate).DisplayText; }
            set
            {
                if (this.DisplayText == value)
                    return;
                //セルテンプレートの値を変更する
                ((DataGridViewProgressBarCell)this.CellTemplate).DisplayText =
                    value;
                //DataGridViewにすでに追加されているセルの値を変更する
                if (this.DataGridView == null)
                    return;
                int rowCount = this.DataGridView.RowCount;
                for (int i = 0; i < rowCount; i++)
                {
                    DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
                    ((DataGridViewProgressBarCell)r.Cells[this.Index]).DisplayText =
                        value;
                }
            }
        }

        /// <summary>ProgressBarの最小値を取得・設定します。</summary>
        public FlatStyle FlatStyle
        {
            get { return ((DataGridViewProgressBarCell)this.CellTemplate).FlatStyle; }
            set
            {
                if (this.FlatStyle == value)
                    return;
                //セルテンプレートの値を変更する
                ((DataGridViewProgressBarCell)this.CellTemplate).FlatStyle =
                    value;
                //DataGridViewにすでに追加されているセルの値を変更する
                if (this.DataGridView == null)
                    return;
                int rowCount = this.DataGridView.RowCount;
                for (int i = 0; i < rowCount; i++)
                {
                    DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
                    ((DataGridViewProgressBarCell)r.Cells[this.Index]).FlatStyle =
                        value;
                }
            }
        }

        /// <summary>ProgressBarの最小値を取得・設定します。</summary>
        public FlatProgressBarAppearance FlatAppearance
        {
            get { return ((DataGridViewProgressBarCell)this.CellTemplate).FlatAppearance; }
            set
            {
                if (this.FlatAppearance == value)
                    return;
                //セルテンプレートの値を変更する
                ((DataGridViewProgressBarCell)this.CellTemplate).FlatAppearance.SetValues(value);
                //DataGridViewにすでに追加されているセルの値を変更する
                if (this.DataGridView == null)
                    return;
                int rowCount = this.DataGridView.RowCount;
                for (int i = 0; i < rowCount; i++)
                {
                    DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
                    ((DataGridViewProgressBarCell)r.Cells[this.Index]).FlatAppearance.SetValues(value);
                }
            }
        }
    }
}